#coding=utf-8
'''
1)为了对字典值执行计算操作，通常需要使用 zip() 函数先将键和值反转过来。
2)zip() 函数创建的是一个只能访问一次的迭代器
3)
'''
prices = {
    'ACME': 45.23,
    'AAPL': 612.78,
    'IBM': 205.55,
    'HPQ': 37.20,
    'FB': 10.75
}

min_price = min(zip(prices.values(), prices.keys()))    # (10.75, 'FB')
max_price = max(zip(prices.values(), prices.keys()))    # (612.78, 'AAPL')

prices_sorted = sorted(zip(prices.values(), prices.keys()))  # [(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]

prices_and_names = zip(prices.values(), prices.keys())
print(min(prices_and_names))  # OK
print(max(prices_and_names))  # # ValueError: max() arg is an empty sequence

min(prices, key=lambda k: prices[k])  # Returns 'FB'

# 需要注意的是在计算操作中使用到了 (值，键) 对。当多个实体拥有相同的值的时
# 候，键会决定返回结果。比如，在执行 min() 和 max() 操作的时候，如果恰巧最小或
# 最大值有重复的，那么拥有最小或最大键的实体会返回
prices = {'AAA': 45.23, 'ZZZ': 45.23}
print(min(zip(prices.values(), prices.keys())))  # (45.23, 'AAA')
max(zip(prices.values(), prices.keys()))  # (45.23, 'ZZZ')